A trace includes one or more consecutively executed instructions. In particular, sequences of instructions, such as emulated instructions, are dynamically compiled into a more compact sequence of native instructions. Such sequences are called traces. Traces are distinct from traditional compilation frameworks in that typical program boundaries, such as functions, methods, modules, components, etc., are not recognized. Traces simply absorb the execution stream of the program irrespective of such boundaries.
With no visibility into the program boundaries, there are inherent difficulties for compiler developers to deal with trace frameworks. The lack of handles on program units makes control over what gets compiled very difficult to define. Any perturbation of the execution order of the system from startup onwards can cause the execution of the problem area to either move to an unpredictable point in execution or to simply remove the execution of such an area making observation, reproduction and handling of problems very difficult. This can have a tremendous impact on productivity.